import java.util.HashSet;
import java.util.Set;

//leetcode_160:相交链表
//给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点，返回null 。
public class leetcode_160 {
    //方法一：哈希集合
//    判断两个链表是否相交，可以使用哈希集合存储链表节点。
//    首先遍历链表headA，并将链表headA中的每个节点加入哈希集合中。然后遍历链表headB，对于遍历到的每个节点，
//    判断该节点是否在哈希集合中：如果当前节点不在哈希集合中，则继续遍历下一个节点；
//    如果当前节点在哈希集合中，则后面的节点都在哈希集合中，即从当前节点开始的所有节点都在两个链表的相交部分，
//    因此在链表 headB 中遍历到的第一个在哈希集合中的节点就是两个链表相交的节点，返回该节点。
//    如果链表headB中的所有节点都不在哈希集合中，则两个链表不相交，返回 null。
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set<ListNode> visited = new HashSet<ListNode>();
        ListNode temp = headA;
        while (temp != null) {
            visited.add(temp);
            temp = temp.next;
        }
        temp = headB;
        while (temp != null) {
            if (visited.contains(temp)) {
                return temp;
            }
            temp = temp.next;
        }
        return null;
    }

    //    复杂度分析：
//    时间复杂度：O(m+n)，其中m和n是分别是链表headA和headB的长度。需要遍历两个链表各一次。
//    空间复杂度：O(m)，其中m是链表headA 的长度。需要使用哈希集合存储链表headA 中的全部节点。
    public class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
            next = null;
        }

    }
}
